 function  [ci, y] = ciboot(x,theta,method,C,B,p1,p2,p3,p4,p5,p6,p7,p8,p9)
%CIBOOT   Bootstrap confidence interval.
%
%	  ci = ciboot(x,'T',method,C,B)
%	  
%	  Compute a bootstrap confidence interval for T(X) with level
%	  C. Default for C is 0.90. Number of resamples is B, with default
%	  that is different for different methods. The method is
%
%	  1.  Normal approximation (std is bootstrap).
%	  2.  Simple bootstrap principle (bad, don't use).
%	  3.  Studentized, std is computed via jackknife (If T is
%	      'mean' this done the fast way via the routine TEST1B).
%	  4.  Studentized, std is 30 samples' bootstrap.
%	  5.  Efron's percentile method.
%	  6.  Efron's percentile method with bias correction (BC).
%
%	  Default method is 5. Often T(X) is a number but it may also 
%	  be a vector or even a matrix. Every row of the result ci 
%	  is of the form 
%	  
%	      [LeftLimit, PointEstimate, RightLimit]
%
%	  and the corresponding element of T(X) is found by noting 
%	  that t = T(X); t = t(:); is used in the routine. Try for 
%	  example X = rand(13,2), C = cov(X), ci = ciboot(X,'cov').
%
%	  See also STDBOOT and STDJACK.
 
%       Anders Holtsberg, 1994, 1998
%       Copyright (c) Anders Holtsberg
% referred from http://www.koders.com

if nargin < 5, B = []; end
if nargin < 4, C = []; end
if nargin < 3, method = []; end
arglist = [];
for i = 6:nargin
   arglist = [arglist, ',p', num2str(i-5)];
end
if min(size(x)) == 1
   x = x(:);
end
if isempty(method)
   method = 5;
end
if isempty(C)
   C = 0.9;
end
alpha = (1-C)/2;
[n,nx] = size(x);

% === 1 ================================================

if method == 1 
   if isempty(B), B = 500; end
   s = eval(['stdboot(x,theta,B',arglist,')']);
   s = s(:);
   t0 = eval([theta,'(x',arglist,')']);
   t0 = t0(:);
   z = qnorm(1-(1-C)/2);
   ci = [t0-z*s, t0, t0+z*s];
   return;
end

% === 2 5 6 ==============================================

if method == 2 | method == 5 | method == 6
   if isempty(B), B = 500; end
   [s,y] = eval(['stdboot(x,theta,B',arglist,')']);
   t0 = eval([theta,'(x',arglist,')']);
   t0 = t0(:);
   if method == 2 | method == 5
      q = quantile(y',[alpha, 1-alpha]',1);
      if method == 2
         ci = [2*t0-q(2,:)', t0, 2*t0-q(1,:)'];
      else
         ci = [q(1,:)', t0, q(2,:)'];
      end
   else
      t00 = t0(:,ones(size(y,2),1));
      J = ((y<t00)+(y<=t00))/2;
      z0 = qnorm(mean(J'));
      beta = pnorm(qnorm([alpha,1-alpha]')*...
             ones(1,length(z0))+2*ones(2,1)*z0);
      q = zeros(2,length(z0));
      for i=1:length(z0)
         q(:,i) = quantile(y(i,:),beta(:,i),1);
      end
      ci = [q(1,:)', t0, q(2,:)'];   
   end
   return
end

% === 3 'mean' ===========================================

if method == 3 & strcmp(theta,'mean')
   if isempty(B), B = 1000; end
   [dummy1,ci,dummy2,y] = test1b(x,C,B);
   return
end

% === 3 4 ================================================

if method == 3 | method == 4
   if isempty(B), B = 200; end
   evalstring1 = [theta,'(xb',arglist,')'];
   if method == 3 
      evalstring2 = ['stdjack(xb,theta',arglist,')'];
   else
      evalstring2 = ['stdboot(xb,theta,30',arglist,')'];
   end
   xb = x;
   t0 = eval(evalstring1);
   s0 = eval(['stdboot(xb,theta,200',arglist,')']);
   t0 = t0(:);
   s0 = s0(:);
   y = zeros(length(t0(:)),B);
   tic
   nfl = flops;
   fprintf(' B-i      flops\n')
   for i = 1:B
      xb = rboot(x);
      tb = eval(evalstring1);
      sb = eval(evalstring2);
      tb = tb(:);
      sb = sb(:);
      y(:,i) = (tb-t0) ./ sb;
      if toc > 1, tic, fprintf('%4.0f %10.0f\n',B-i,flops-nfl), end
   end
   q = quantile(y',[alpha, 1-alpha]',1);
   ci = [t0-s0.*q(2,:)', t0, t0-s0.*q(1,:)'];
   return
end